package br.trainee.web.dao.impl;

import java.math.BigDecimal;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;

import oracle.jdbc.internal.OracleTypes;
import br.trainee.web.anotacoes.ConnectionQualifier;
import br.trainee.web.dao.service.old_IClinicaDAO_old;
import br.trainee.web.enumeradores.TipoConexao;
import br.trainee.web.vo.CidadeVO;
import br.trainee.web.vo.ClinicaVO;
import br.trainee.web.vo.EmailClinicaVO;
import br.trainee.web.vo.EnderecoClinicaVO;
import br.trainee.web.vo.EstadoVO;
import br.trainee.web.vo.StatusVO;
import br.trainee.web.vo.TelefoneClinicaVO;
import br.trainee.web.vo.TipoTelefoneVO;

@RequestScoped
public class ClinicaDAO_OLD extends GenericoDAO<ClinicaVO> implements old_IClinicaDAO_old {
	
	@Inject
	@ConnectionQualifier(tipoConexao = TipoConexao.ORACLE)
	private Connection conexao;
	
	@Inject
	private Logger log;
	
	private CallableStatement cstm;
	
	private ResultSet rs;
	
	@Override
	public boolean incluir(ClinicaVO clinica) {
		boolean flagSucesso = true;
		
		try {
			conexao.setAutoCommit(false);
			cstm = conexao.prepareCall("{call pr_incluir_clinica(?,?,?,?)}");
			
			//cstm.setString(1, clinica.getNomeClinica());
			cstm.setString(2, clinica.getCnpj());
			if(clinica.getFotoClinica() != null){
				cstm.setObject(3, clinica.getFotoClinica());
			}
			else{
				cstm.setNull(3, OracleTypes.BLOB);
			}
			cstm.registerOutParameter(4, OracleTypes.NUMBER);
			
			if(!cstm.execute()){
				
				/*BigDecimal idClinica = (BigDecimal) cstm.getObject(4);
				
				
				for (EmailClinicaVO email : clinica.getEmails()) {
					email.setClinica(new ClinicaVO());
					
					email.getClinica().setIdClinica(idClinica.longValue());
				}
				
				for (EnderecoClinicaVO endereco : clinica.getEnderecos()){
					endereco.setClinica(new ClinicaVO());
					
					//endereco.getClinica().setIdClinica(idClinica.longValue());
				}
				
				for (TelefoneClinicaVO telefone : clinica.getTelefones()){
					telefone.setClinica(new ClinicaVO());
					
					telefone.getClinica().setIdClinica(idClinica.longValue());
				}
				
				
				if(incluirEmail(clinica.getEmails(), conexao) && incluirEndereco(clinica.getEnderecos(), conexao) 
					&& incluirTelefone(clinica.getTelefones(), conexao)){
					
					conexao.commit();
				}
				else{
					conexao.rollback();
					flagSucesso = false;
				}*/
				
			}
			
			
		} catch (SQLException e) {
			
			log.log(Level.SEVERE, e.getMessage());
			flagSucesso = false;
			try {
				conexao.rollback();
				
			} catch (SQLException e1) {
				
				log.log(Level.SEVERE, e.getMessage());
			}
		}
		finally{
			try {
				conexao.close();
				cstm.close();
				
			} catch (SQLException e) {
				log.log(Level.SEVERE, e.getMessage());
			}
		}
		
		return flagSucesso;
	}

	@Override
	public boolean incluirEmail(List<EmailClinicaVO> emails, Connection conexao) throws SQLException {
		
		CallableStatement cstm = null;
		
		try {
			cstm = conexao.prepareCall("{call pr_incluir_email_clinica(?,?)}");
			
			for (EmailClinicaVO emailClinicaVO : emails) {
				
				//cstm.setLong(1, emailClinicaVO.getClinica().getIdClinica());
				cstm.setString(2, emailClinicaVO.getEmailClinica());
				
				if(cstm.execute()){
					return false;
				}
				
			}
			
		} 
		finally{
			
			cstm.close();
		}
		
		return true;
	}
	

	@Override
	public boolean incluirTelefone(List<TelefoneClinicaVO> telefones, Connection conexao) throws SQLException {
		
		CallableStatement cstm = null;
		
		try {
			cstm = conexao.prepareCall("{call pr_incluir_telefone_clinica(?,?,?,?)}");
			
			for (TelefoneClinicaVO telefoneClinicaVO : telefones) {
				
				//cstm.setLong(1, telefoneClinicaVO.getClinica().getIdClinica());
				cstm.setLong(2, telefoneClinicaVO.getTelefoneClinica());
				cstm.setInt(3, telefoneClinicaVO.getDddClinica());
				cstm.setLong(4, telefoneClinicaVO.getTipoTelefone().getIdTipoTelefone());
				
				if(cstm.execute()){
					return false;
				}
			}
		}
		finally{
			
			cstm.close();
		}
		
		return true;
	}
	

	@Override
	public boolean incluirEndereco(List<EnderecoClinicaVO> enderecos, Connection conexao) throws SQLException {
		CallableStatement cstm = null;
		
		try {
			cstm = conexao.prepareCall("{call pr_incluir_endereco_clinica(?,?,?,?,?,?)}");
			
			for (EnderecoClinicaVO enderecoClinicaVO : enderecos) {
				
				cstm.setLong(1, enderecoClinicaVO.getCidade().getIdCidade());
				//cstm.setLong(2, enderecoClinicaVO.getClinica().getIdClinica());
				cstm.setString(3, enderecoClinicaVO.getBairroClinica());
				cstm.setString(4, enderecoClinicaVO.getLogradouroClinica());
				cstm.setString(5, enderecoClinicaVO.getComplementoClinica());
				cstm.setString(6, enderecoClinicaVO.getCepClinica());
				
				if(cstm.execute()){
					return false;
				}
				
			}
			
		} 
		finally{
			
			cstm.close();
		
		}
		
		return true;
	}
	
	@Override
	public List<ClinicaVO> consultarTodosClinica(String nome,String cnpj) {
		
		List<ClinicaVO> listaClinica = new ArrayList<ClinicaVO>();
		ClinicaVO clinica = null;
		
		try {
			cstm = conexao.prepareCall("{call pr_consultar_clinica(?,?,?)}");
			
			if(nome == null){
				cstm.setNull(1, OracleTypes.NULL);
			}
			else{
				cstm.setString(1, nome);
			}
			
			if(cnpj == null){
				cstm.setNull(2, OracleTypes.NULL);
			}
			else{
				cstm.setString(2, cnpj);
			}
	
			cstm.registerOutParameter(3, OracleTypes.CURSOR);
			
			if(!cstm.execute()){
				rs = (ResultSet) cstm.getObject(3);
	
				while(rs.next()){
					
					clinica = new ClinicaVO();
					
					clinica.setCnpj(rs.getString("cnpj"));
					//clinica.setIdClinica(rs.getLong("id_clinica"));
					//clinica.setNomeClinica(rs.getString("nome_clinica"));
					clinica.setFotoClinica(rs.getBytes("foto_clinica"));
					
					StatusVO status =  new StatusVO();
					status.setIdStatus(rs.getLong("id_status"));
					status.setDescricaoStatus(rs.getString("descricao_status"));
					status.setTipoStatus(rs.getInt("tipo_status"));
					
					//clinica.setStatus(status);
					
					listaClinica.add(clinica);
					
				}
			}
			
		} catch (SQLException e) {
			
			log.log(Level.SEVERE, e.getMessage());
			return null;
		}
		finally{
			try {
				conexao.close();
				cstm.close();
				if(rs != null){
					rs.close();
				}
			} catch (SQLException e) {
				log.log(Level.SEVERE, e.getMessage());
			}
		}
		
		return listaClinica;
	}
	

	
	private List<EmailClinicaVO> consultarEmails(Long idClinica) throws SQLException { 
		List<EmailClinicaVO> listaEmail = null;
		EmailClinicaVO email = null;
		CallableStatement cstm = null;
		ResultSet rs =  null;
		
		try {
			cstm = conexao.prepareCall("{call pr_consultar_email_clinica(?,?)}");
			
			cstm.setLong(1, idClinica);
			cstm.registerOutParameter(2, OracleTypes.CURSOR);
			
			if (!cstm.execute()) {

				rs = (ResultSet) cstm.getObject(2);
				listaEmail = new ArrayList<EmailClinicaVO>();

				while (rs.next()) {
					
					email = new EmailClinicaVO();
					
					email.setClinica(new ClinicaVO());
					//email.getClinica().setIdClinica(rs.getLong("id_clinica"));
					email.setIdEmailClinica(rs.getLong("id_email_clinica"));
					email.setEmailClinica(rs.getString("email_clinica"));
					
					listaEmail.add(email);
					
				}
			}
			
		} finally{
			
			cstm.close();
			if(rs != null){
				rs.close();
			}
			
		}
		
		return listaEmail;
	}
	

	
	private List<TelefoneClinicaVO> consultarTelefones(Long idClinica) throws SQLException {
		
		List<TelefoneClinicaVO> listaTelefone = null;
		TelefoneClinicaVO telefone = null;
		CallableStatement cstm = null;
		ResultSet rs = null;
		
		try {
			cstm = conexao.prepareCall("{call pr_consultar_telefone_clinica(?,?)}");
			
			cstm.setLong(1, idClinica);
			cstm.registerOutParameter(2, OracleTypes.CURSOR);
			
			if(!cstm.execute()){
				
				rs = (ResultSet) cstm.getObject(2);
				listaTelefone = new ArrayList<TelefoneClinicaVO>();
				
				while(rs.next()){
					
					telefone =  new TelefoneClinicaVO();
					
					//telefone.setClinica(new ClinicaVO());
					//telefone.getClinica().setIdClinica(rs.getLong("id_clinica"));
					telefone.setDddClinica(rs.getInt("ddd_clinica"));
					telefone.setIdTelefoneClinica(rs.getLong("id_telefone_clinica"));
					telefone.setTelefoneClinica(rs.getLong("telefone_clinica"));
					
					TipoTelefoneVO tipoTelefone =  new TipoTelefoneVO();
					tipoTelefone.setDescricao(rs.getString("descricao"));
					tipoTelefone.setIdTipoTelefone(rs.getLong("id_tipo_telefone"));
					tipoTelefone.setTipoTelefone(rs.getInt("tipo_telefone"));
					
					telefone.setTipoTelefone(tipoTelefone);
					
					listaTelefone.add(telefone);
					
				}
			}
			
		} finally{
			
			cstm.close();
			
			if(rs != null){
				rs.close();
			}
			
		}
		
		
		return listaTelefone;
	}
	

	
	private List<EnderecoClinicaVO> consultarEnderecos(Long idClinica) throws SQLException {
		
		List<EnderecoClinicaVO> listaEndereco =  null;
		EnderecoClinicaVO endereco = null;
		CallableStatement cstm =  null;
		ResultSet rs =  null;
		
		try {
			cstm = conexao.prepareCall("{call pr_consultar_endereco_clinica(?,?)}");
			
			cstm.setLong(1, idClinica);
			cstm.registerOutParameter(2, OracleTypes.CURSOR);
			
			if(!cstm.execute()){
				
				rs = (ResultSet) cstm.getObject(2);
				listaEndereco =  new ArrayList<EnderecoClinicaVO>();
				
				while(rs.next()){
					
					endereco =  new EnderecoClinicaVO();
					
					endereco.setBairroClinica(rs.getString("bairro_clinica"));
					endereco.setCepClinica(rs.getString("cep_clinica"));
					endereco.setComplementoClinica(rs.getString("complemento_clinica"));
					endereco.setLogradouroClinica(rs.getString("logradouro_clinica"));
					endereco.setIdEnderecoClinica(rs.getLong("id_endereco_clinica"));
					endereco.setClinica(new ClinicaVO());
					//endereco.getClinica().setIdClinica(rs.getLong("id_clinica"));
					
					CidadeVO cidade = new CidadeVO();
					cidade.setIdCidade(rs.getLong("id_cidade"));
					cidade.setNomeCidade(rs.getString("nome_cidade"));
					
					EstadoVO estado =  new EstadoVO();
					estado.setIdEstado(rs.getLong("id_estado"));
					estado.setNomeEstado(rs.getString("nome_estado"));
					estado.setSiglaEstado(rs.getString("sigla_estado"));
					
					cidade.setEstado(estado);
					endereco.setCidade(cidade);
					
					listaEndereco.add(endereco);
				}
				
			}
			
		} finally{
			
			cstm.close();
			
			if(rs != null){
				rs.close();
			}
			
		}
		
		return listaEndereco;
	}
	

	@Override
	public ClinicaVO detalharClinica(Long idClinica){
		ClinicaVO clinica = new ClinicaVO();
		
		try {
		
		clinica.setEmails(consultarEmails(idClinica));
		//clinica.setTelefones(consultarTelefones(idClinica));
		clinica.setEnderecos(consultarEnderecos(idClinica));
		
		
			conexao.close();
			
		} catch (SQLException e) {
			log.log(Level.SEVERE, e.getMessage());
		}
		
		return clinica;
	}

	@Override
	public ClinicaVO consultarFotoPorId(Long idClinica) {
		ClinicaVO clinica = null;
		
		try {
			cstm = conexao.prepareCall("{call pr_consultar_imagem_clinica(?,?)}");
			
			cstm.setLong(1, idClinica);
			cstm.registerOutParameter(2, OracleTypes.CURSOR);
			
			if(!cstm.execute()){
				
				rs = (ResultSet) cstm.getObject(2);
				
				if(rs.next()){
					
					clinica = new ClinicaVO();
					clinica.setFotoClinica(rs.getBytes("foto_clinica"));
					
					
				}
			}
			
			
		} catch (SQLException e) {
			log.log(Level.SEVERE, e.getMessage());
			
			clinica = null;
		}
		finally{
			
			try {
				cstm.close();
				conexao.close();
				if(rs != null){
					rs.close();
				}
			} catch (SQLException e) {
				log.log(Level.SEVERE, e.getMessage());
			}
		}
				
		return clinica;
	}
	
	@Override
	public ClinicaVO consultarPorId(Long id) {
	
		ClinicaVO clinica = null;
		
		try {
			
			cstm = conexao.prepareCall("{call pr_consultar_clinica_id(?,?)}");
			
			cstm.setLong(1, id);
			cstm.registerOutParameter(2, OracleTypes.CURSOR);
			
			if(!cstm.execute()){
				
				rs = (ResultSet) cstm.getObject(2);
				
				if(rs.next()){
					
					clinica = new ClinicaVO();
					
					//clinica.setNomeClinica(rs.getString("nome_clinica"));
					clinica.setCnpj(rs.getString("cnpj"));
					//clinica.setIdClinica(id);
					
				}
				
			}
			
		} catch (SQLException e) {
			
			log.log(Level.SEVERE, e.getMessage());
			
			clinica = null;
		}
		finally{
			
			try {
				cstm.close();
				conexao.close();
				if(rs != null){
					rs.close();
				}
			} catch (SQLException e) {
				
				log.log(Level.SEVERE, e.getMessage());			
			
			}
		}
		
		return clinica;	
	}
	
	@Override
	public boolean alterar(ClinicaVO clinica) {
		
		try {
			cstm = conexao.prepareCall("{call pr_alterar_clinica(?,?,?,?)}");
			
			//cstm.setLong(1, clinica.getIdClinica());
			//cstm.setString(2, clinica.getNomeClinica());
			cstm.setString(3, clinica.getCnpj());
			cstm.registerOutParameter(4, OracleTypes.NUMBER);
			
			if(!cstm.execute()){
				
				BigDecimal qtdLinhas = (BigDecimal) cstm.getObject(4);	
			}
			
		} catch (SQLException e) {
			log.log(Level.SEVERE, e.getMessage());
			return false;
		}
		finally{
			
			try {
				cstm.close();
				conexao.close();
				
			} catch (SQLException e) {
				
				log.log(Level.SEVERE, e.getMessage());
			}
			
		}
		
		return true;
	}

	@Override
	public boolean alterarEmail(EmailClinicaVO email) {
		
		try {
			cstm = conexao.prepareCall("{call pr_alterar_email_clinica(?,?,?)}");
			
			cstm.setLong(1, email.getIdEmailClinica());
			cstm.setString(2, email.getEmailClinica());
			cstm.registerOutParameter(3, OracleTypes.NUMBER);
			
			if(!cstm.execute()){
				
				BigDecimal qtdLinhas = (BigDecimal) cstm.getObject(3);
			}
			
		} catch (SQLException e) {

			log.log(Level.SEVERE, e.getMessage());
			return false;
		}
		finally{
			
			try {
				cstm.close();
				conexao.close();
				
			} catch (SQLException e) {
				
				log.log(Level.SEVERE, e.getMessage());
			}
		}
		
		
		return true;
	}

	@Override
	public boolean alterarEndereco(EnderecoClinicaVO endereco) {
		
		try {
			cstm = conexao.prepareCall("{call pr_alterar_endereco_clincia(?,?,?,?,?,?,?)}");
			
			cstm.setLong(1, endereco.getIdEnderecoClinica());
			cstm.setLong(2, endereco.getCidade().getIdCidade());
			cstm.setString(3, endereco.getBairroClinica());
			cstm.setString(4, endereco.getLogradouroClinica());
			cstm.setString(5, endereco.getComplementoClinica());
			cstm.setString(6, endereco.getCepClinica());
			cstm.registerOutParameter(7, OracleTypes.NUMBER);
			
			if(!cstm.execute()){
				
				BigDecimal qtdLinhas = (BigDecimal) cstm.getObject(7);
			}
			
		} catch (SQLException e) {
			log.log(Level.SEVERE, e.getMessage());
			return false;
		}
		finally{
			
			try {
				
				cstm.close();
				conexao.close();
				
			} catch (SQLException e) {
				log.log(Level.SEVERE, e.getMessage());
			}
		}
		
		return true;
	}

	@Override
	public boolean alterarTelefone(TelefoneClinicaVO telefone) {
		
		try {
			
			cstm = conexao.prepareCall("{call pr_alterar_telefone_clincia(?,?,?,?,?)}");
			
			cstm.setLong(1, telefone.getIdTelefoneClinica());
			cstm.setLong(2, telefone.getTelefoneClinica());
			cstm.setInt(3, telefone.getDddClinica());
			cstm.setLong(4, telefone.getTipoTelefone().getIdTipoTelefone());
			cstm.registerOutParameter(5, OracleTypes.NUMBER);
			
			if(!cstm.execute()){
				
				BigDecimal qtdLinhas = (BigDecimal) cstm.getObject(5);
			}
			
		} catch (SQLException e) {
			
			log.log(Level.SEVERE, e.getMessage());
			return false;
		}
		finally{
			
			try {
				cstm.close();
				conexao.close();
			} catch (SQLException e) {
				
				log.log(Level.SEVERE, e.getMessage());
			}
		}
		
		return true;
	}

	@Override
	public EmailClinicaVO consultarEmailPorId(Long idEmail) {
		
		EmailClinicaVO email = null;
		
		try {
			cstm = conexao.prepareCall("{call pr_consultar_email_id(?,?)}");
			
			cstm.setLong(1, idEmail);
			cstm.registerOutParameter(2, OracleTypes.CURSOR);
			
			if(!cstm.execute()){
				
				rs = (ResultSet) cstm.getObject(2);
				
				if(rs.next()){
					
					email = new EmailClinicaVO();
					email.setEmailClinica(rs.getString("email_clinica"));
					email.setClinica(new ClinicaVO());
					//email.getClinica().setIdClinica(rs.getLong("id_clinica"));
					email.setIdEmailClinica(idEmail);
				}
			}
			
		} catch (SQLException e) {
			log.log(Level.SEVERE, e.getMessage());
			email = null;
		}
		finally{
			
			try {
				cstm.close();
				conexao.close();
				if(rs != null){
					rs.close();
				}
			} catch (SQLException e) {
				log.log(Level.SEVERE, e.getMessage());
			}
		}
		
		return email;
	}

	@Override
	public EnderecoClinicaVO consultarEnderecoPorId(Long idEndereco) {
		
		EnderecoClinicaVO endereco = null;
		
		try {
			
			cstm = conexao.prepareCall("{call pr_consultar_endereco_id(?,?)}");
			
			cstm.setLong(1, idEndereco);
			cstm.registerOutParameter(2, OracleTypes.CURSOR);
			
			if(!cstm.execute()){
				
				rs = (ResultSet) cstm.getObject(2);
				
				if(rs.next()){
					
					endereco = new EnderecoClinicaVO();
					
					endereco.setIdEnderecoClinica(idEndereco);
					endereco.setBairroClinica(rs.getString("bairro_clinica"));
					endereco.setLogradouroClinica(rs.getString("logradouro_clinica"));
					endereco.setComplementoClinica(rs.getString("complemento_clinica"));
					endereco.setCepClinica(rs.getString("cep_clinica"));
					endereco.setClinica(new ClinicaVO());
					//endereco.getClinica().setIdClinica(rs.getLong("id_clinica"));
					endereco.setCidade(new CidadeVO());
					endereco.getCidade().setIdCidade(rs.getLong("id_cidade"));
					endereco.getCidade().setNomeCidade(rs.getString("nome_cidade"));
					endereco.getCidade().setEstado(new EstadoVO());
					endereco.getCidade().getEstado().setIdEstado(rs.getLong("id_estado"));
					endereco.getCidade().getEstado().setNomeEstado(rs.getString("nome_estado"));
					endereco.getCidade().getEstado().setSiglaEstado(rs.getString("sigla_estado"));
			
				}
			}
			
		} catch (SQLException e) {
			log.log(Level.SEVERE, e.getMessage());
			endereco = null;
		}
		finally{
			
			try {
				cstm.close();
				conexao.close();
				if(rs != null){
					rs.close();
				}
				
			} catch (SQLException e) {
				log.log(Level.SEVERE, e.getMessage());
			}
		}
		
		return endereco;
	}

	@Override
	public TelefoneClinicaVO consultarTelefonePorId(Long idTelefone) {
		
		TelefoneClinicaVO telefone = null;
		
		try {
			cstm = conexao.prepareCall("{call pr_consultar_telefone_id(?,?)}");
			
			cstm.setLong(1, idTelefone);
			cstm.registerOutParameter(2, OracleTypes.CURSOR);
			
			if(!cstm.execute()){
				
				rs = (ResultSet) cstm.getObject(2);
				
				if(rs.next()){
					
					telefone = new TelefoneClinicaVO();
					
					telefone.setIdTelefoneClinica(idTelefone);
					//telefone.setClinica(new ClinicaVO());
					//telefone.getClinica().setIdClinica(rs.getLong("id_clinica"));
					telefone.setDddClinica(rs.getInt("ddd_clinica"));
					telefone.setTelefoneClinica(rs.getLong("telefone_clinica"));
					telefone.setTipoTelefone(new TipoTelefoneVO());
					telefone.getTipoTelefone().setIdTipoTelefone(rs.getLong("id_tipo_telefone"));
					telefone.getTipoTelefone().setDescricao(rs.getString("descricao"));
					telefone.getTipoTelefone().setTipoTelefone(rs.getInt("tipo_telefone"));
				}
			}
			
		} catch (SQLException e) {
			log.log(Level.SEVERE, e.getMessage());
			telefone = null;
		}
		finally{
			
			try {
				
				cstm.close();
				conexao.close();
				if(rs != null){
					rs.close();
				}
				
			} catch (SQLException e) {
				log.log(Level.SEVERE, e.getMessage());
			}
		}
		
		return telefone;
	}
	
	@Override
	public boolean excluir(Long idClinica) {
		
		try {
			cstm = conexao.prepareCall("{call pr_excluir_clinica(?,?)}");
			
			cstm.setLong(1, idClinica);
			cstm.registerOutParameter(2, OracleTypes.NUMBER);
			
			if(!cstm.execute()){
				
				BigDecimal qtdLinhas = (BigDecimal) cstm.getObject(2);
			}
			
			
		} catch (SQLException e) {
			log.log(Level.SEVERE, e.getMessage());
			return false;
		}
		finally{
			
			try {
				cstm.close();
				
			} catch (SQLException e) {
				log.log(Level.SEVERE, e.getMessage());
			}
		}
		
		return true;
	}

	@Override
	public boolean excluirEmail(Long idEmail) {
		
		try {
			cstm = conexao.prepareCall("{call pr_excluir_email_clinica(?,?)}");
			
			cstm.setLong(1, idEmail);
			cstm.registerOutParameter(2, OracleTypes.NUMBER);
			
			if(!cstm.execute()){
				
				BigDecimal qtdLinhas = (BigDecimal) cstm.getObject(2);
			}
			
		} catch (SQLException e) {
			log.log(Level.SEVERE, e.getMessage());
			return false;
		}
		finally{
			
			try {
				
				cstm.close();
				
			} catch (SQLException e) {
				log.log(Level.SEVERE, e.getMessage());
			}
		}
		
		return true;
	}

	@Override
	public boolean excluirTelefone(Long idTelefone) {
		
		try {
			cstm = conexao.prepareCall("{call pr_excluir_telefone_clinica(?,?)}");
			
			cstm.setLong(1, idTelefone);
			cstm.registerOutParameter(2, OracleTypes.NUMBER);
			
			if(!cstm.execute()){
				
				BigDecimal qtdLinhas = (BigDecimal) cstm.getObject(2);
			}
			
		} catch (SQLException e) {
			log.log(Level.SEVERE, e.getMessage());
			return false;
		}
		finally{
			
			try {
				cstm.close();
			} catch (SQLException e) {
				log.log(Level.SEVERE, e.getMessage());
			}
		}
		
		return true;
	}

	@Override
	public boolean excluirEndereco(Long idEndereco) {
		
		try {
			cstm = conexao.prepareCall("{call pr_excluir_endereco_clinica(?,?)}");
			
			cstm.setLong(1, idEndereco);
			cstm.registerOutParameter(2, OracleTypes.NUMBER);
			
			if(!cstm.execute()){
				
				BigDecimal qtdLinhas = (BigDecimal) cstm.getObject(2);
			}
			
		} catch (SQLException e) {
			log.log(Level.SEVERE, e.getMessage());
			return false;
		}
		finally{
			
			try {
				cstm.close();
			} catch (SQLException e) {
				log.log(Level.SEVERE, e.getMessage());
			}
		}
		
		return true;
	}

	@Override
	public List<EnderecoClinicaVO> consultarEnderecosGeral(Long idClinica) {
		List<EnderecoClinicaVO> listaEndereco =  null;
		EnderecoClinicaVO endereco = null;
		
		try {
			cstm = conexao.prepareCall("{call pr_consultar_endereco_clinica(?,?)}");
			
			cstm.setLong(1, idClinica);
			cstm.registerOutParameter(2, OracleTypes.CURSOR);
			
			if(!cstm.execute()){
				
				rs = (ResultSet) cstm.getObject(2);
				listaEndereco =  new ArrayList<EnderecoClinicaVO>();
				
				while(rs.next()){
					
					endereco =  new EnderecoClinicaVO();
					
					endereco.setBairroClinica(rs.getString("bairro_clinica"));
					endereco.setCepClinica(rs.getString("cep_clinica"));
					endereco.setComplementoClinica(rs.getString("complemento_clinica"));
					endereco.setLogradouroClinica(rs.getString("logradouro_clinica"));
					endereco.setIdEnderecoClinica(rs.getLong("id_endereco_clinica"));
					endereco.setClinica(new ClinicaVO());
					//endereco.getClinica().setIdClinica(rs.getLong("id_clinica"));
					
					CidadeVO cidade = new CidadeVO();
					cidade.setIdCidade(rs.getLong("id_cidade"));
					cidade.setNomeCidade(rs.getString("nome_cidade"));
					
					EstadoVO estado =  new EstadoVO();
					estado.setIdEstado(rs.getLong("id_estado"));
					estado.setNomeEstado(rs.getString("nome_estado"));
					estado.setSiglaEstado(rs.getString("sigla_estado"));
					
					cidade.setEstado(estado);
					endereco.setCidade(cidade);
					
					listaEndereco.add(endereco);
				}
				
			}
			
		} catch (SQLException e) {
			
			log.log(Level.SEVERE, e.getMessage());
			listaEndereco = null;
		}
		finally{
			
			try {
				cstm.close();
				conexao.close();
				if(rs != null){
					rs.close();
				}
			} 
			catch (SQLException e) {
				log.log(Level.SEVERE, e.getMessage());			
				
			}
		}
		
		return listaEndereco;
	}

	@Override
	public List<EmailClinicaVO> consultarEmailsGeral(Long idClinica) {
		List<EmailClinicaVO> listaEmail = null;
		EmailClinicaVO email = null;
		
		try {
			cstm = conexao.prepareCall("{call pr_consultar_email_clinica(?,?)}");
			
			cstm.setLong(1, idClinica);
			cstm.registerOutParameter(2, OracleTypes.CURSOR);
			
			if (!cstm.execute()) {

				rs = (ResultSet) cstm.getObject(2);
				listaEmail = new ArrayList<EmailClinicaVO>();

				while (rs.next()) {
					
					email = new EmailClinicaVO();
					
					email.setClinica(new ClinicaVO());
					//email.getClinica().setIdClinica(rs.getLong("id_clinica"));
					email.setIdEmailClinica(rs.getLong("id_email_clinica"));
					email.setEmailClinica(rs.getString("email_clinica"));
					
					listaEmail.add(email);
					
				}
			}
			
		} catch (SQLException e) {
			
			log.log(Level.SEVERE, e.getMessage());
			listaEmail = null;
		}
		finally{
			
			try {
				cstm.close();
				conexao.close();
				if(rs != null){
					rs.close();
				}
			} 
			catch (SQLException e) {
				log.log(Level.SEVERE, e.getMessage());			
				
			}
		}
		
		return listaEmail;
	}

	@Override
	public List<TelefoneClinicaVO> consultarTelefoneGeral(Long idClinica) {
		List<TelefoneClinicaVO> listaTelefone = null;
		TelefoneClinicaVO telefone = null;
		
		try {
			cstm = conexao.prepareCall("{call pr_consultar_telefone_clinica(?,?)}");
			
			cstm.setLong(1, idClinica);
			cstm.registerOutParameter(2, OracleTypes.CURSOR);
			
			if(!cstm.execute()){
				
				rs = (ResultSet) cstm.getObject(2);
				listaTelefone = new ArrayList<TelefoneClinicaVO>();
				
				while(rs.next()){
					
					telefone =  new TelefoneClinicaVO();
					
					//telefone.setClinica(new ClinicaVO());
					//telefone.getClinica().setIdClinica(rs.getLong("id_clinica"));
					telefone.setDddClinica(rs.getInt("ddd_clinica"));
					telefone.setIdTelefoneClinica(rs.getLong("id_telefone_clinica"));
					telefone.setTelefoneClinica(rs.getLong("telefone_clinica"));
					
					TipoTelefoneVO tipoTelefone =  new TipoTelefoneVO();
					tipoTelefone.setDescricao(rs.getString("descricao"));
					tipoTelefone.setIdTipoTelefone(rs.getLong("id_tipo_telefone"));
					tipoTelefone.setTipoTelefone(rs.getInt("tipo_telefone"));
					
					telefone.setTipoTelefone(tipoTelefone);
					
					listaTelefone.add(telefone);
					
				}
			}
			
		}catch (SQLException e) {
			
			log.log(Level.SEVERE, e.getMessage());
			listaTelefone = null;
		}
		finally{
			
			try {
				cstm.close();
				conexao.close();
				if(rs != null){
					rs.close();
				}
			} 
			catch (SQLException e) {
				log.log(Level.SEVERE, e.getMessage());			
				
			}
		}
		
		
		return listaTelefone;
	}

}
